package org.mzx.shortLink.adminn.common.config;

import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RBloomFilterConfiguration {

    /**
     * 防止用户注册查询数据库的布隆过滤器
     */
    @Bean
    public RBloomFilter<String> userRegisterCachePenetrationBloomFilter(RedissonClient redissonClient) {
        RBloomFilter<String> cachePenetrationBloomFilter = redissonClient.getBloomFilter("userRegisterCachePenetrationBloomFilter");
        cachePenetrationBloomFilter.tryInit(10000000L, 0.001);
        //这里的两个参数，一个是初始容量大小，一个是误判率
        //错误率越低，位数组越长，布隆过滤器的内存占用越大。
        //错误率越低，散列 Hash 函数越多，计算耗时较长。
        return cachePenetrationBloomFilter;
    }

    /**
     * 新增分组防止gid重复的布隆过滤器
     * @param redissonClient
     * @return
     */
    @Bean
    public RBloomFilter<String> groupCreateCachePenetrationBloomFilter(RedissonClient redissonClient) {
        RBloomFilter<String> cachePenetrationBloomFilter = redissonClient.getBloomFilter("groupCreateCachePenetrationBloomFilter");
        cachePenetrationBloomFilter.tryInit(10000000L, 0.001);
        //这里的两个参数，一个是初始容量大小，一个是误判率
        //错误率越低，位数组越长，布隆过滤器的内存占用越大。
        //错误率越低，散列 Hash 函数越多，计算耗时较长。
        return cachePenetrationBloomFilter;
    }

    @Bean
    public RBloomFilter<String> groupNameCreateCachePenetrationBloomFilter(RedissonClient redissonClient) {
        RBloomFilter<String> cachePenetrationBloomFilter = redissonClient.getBloomFilter("groupNameCreateCachePenetrationBloomFilter");
        cachePenetrationBloomFilter.tryInit(10000000L, 0.001);
        //这里的两个参数，一个是初始容量大小，一个是误判率
        //错误率越低，位数组越长，布隆过滤器的内存占用越大。
        //错误率越低，散列 Hash 函数越多，计算耗时较长。
        return cachePenetrationBloomFilter;
    }
}
